﻿using AppForm_Managers.Object_Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppForm_Managers.Views
{
    public partial class Departs_Form : Form
    {
        public Departs_Form()
        {
            InitializeComponent();
        }

        private void Departs_Form_Load(object sender, EventArgs e)
        {
            ErrorProvider.Dispose();
            DropProvinces_DataLoad();
            GridDeparts_Load(sender, e);
        }

        private void GridDeparts_Load(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                GridDeparts.DataSource = db.View_Departments.ToList();
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ViewDeparts_Click(object sender, EventArgs e)
        {
            Notifications.Visible = false;
            Notifications.Text = "";
            ErrorProvider.Dispose();

            List<int> listSelected = ViewDeparts.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            if (index > -1)
            {
                UpdateButton.Enabled = true;
                DeleteButton.Enabled = true;
                AddButton.Enabled = false;

                //provID = Int32.Parse(ViewProvinces.GetRowCellValue(index, "ProvID").ToString());

                CodeText.Text = ViewDeparts.GetRowCellValue(index, "CodeOfDep").ToString();
                NameText.Text = ViewDeparts.GetRowCellValue(index, "NameOfDep").ToString();
                DescText.Text = ViewDeparts.GetRowCellValue(index, "Descriptons").ToString();
                CheckStatus.Checked = bool.Parse(ViewDeparts.GetRowCellValue(index, "StatusOfDep").ToString());

                int orgId = Int32.Parse(ViewDeparts.GetRowCellValue(index, "OrgID").ToString());

                ManagerEmployeesEntities db = new ManagerEmployeesEntities();
                Organization org = db.Organizations.Single(d => d.OrgID == orgId);

                ComboProvinces.SelectedValue = org.Commune.District.Province.ProvID;
                ComboDistricts.SelectedValue = org.Commune.District.DistID;
                ComboCommunes.SelectedValue = org.Commune.ComID;
                ComboxOgrans.SelectedValue = org.OrgID;
            }
        }

        private void DropProvinces_DataLoad()
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<Province> list = new List<Province>();

                Province temp = new Province()
                {
                    ProvID = 0,
                    NameOfProvince = "Lựa Chọn",
                    StatusOfProvince = false
                };
                list.Add(temp);
                list.AddRange(db.Provinces.ToList());

                ComboProvinces.DataSource = list;
                ComboProvinces.DisplayMember = "NameOfProvince";
                ComboProvinces.ValueMember = "ProvID";
                ComboProvinces.SelectedIndex = 0;

            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ComboProvinces_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<District> list = new List<District>();
                District temp = new District()
                {
                    DistID = 0,
                    NameOfDist = "Lựa Chọn"
                };
                list.Add(temp);

                if (ComboProvinces.SelectedIndex == 0)
                {
                    ComboDistricts.DataSource = list;
                    ComboDistricts.DisplayMember = "NameOfDist";
                    ComboDistricts.ValueMember = "DistID";
                    ComboDistricts.SelectedIndex = 0;
                }
                else
                {
                    int provinceId = Int32.Parse(ComboProvinces.SelectedValue.ToString());
                    Province provinceCurrent = db.Provinces.Single(p => p.ProvID == provinceId);

                    list.AddRange(provinceCurrent.Districts.ToList());

                    ComboDistricts.DataSource = list;
                    ComboDistricts.DisplayMember = "NameOfDist";
                    ComboDistricts.ValueMember = "DistID";
                    ComboDistricts.SelectedIndex = 0;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ComboDistricts_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<Commune> list = new List<Commune>();
                Commune temp = new Commune()
                {
                    ComID = 0,
                    NameOfComm = "Lựa chọn"
                };
                list.Add(temp);

                if (ComboDistricts.SelectedIndex == 0)
                {
                    ComboCommunes.DataSource = list;
                    ComboCommunes.DisplayMember = "NameOfComm";
                    ComboCommunes.ValueMember = "ComID";
                    ComboCommunes.SelectedIndex = 0;
                }
                else
                {
                    int districtID = Int32.Parse(ComboDistricts.SelectedValue.ToString());
                    District district = db.Districts.SingleOrDefault(p => p.DistID == districtID);
                    list.AddRange(district.Communes.ToList());

                    ComboCommunes.DataSource = list;
                    ComboCommunes.DisplayMember = "NameOfComm";
                    ComboCommunes.ValueMember = "ComID";
                    ComboCommunes.SelectedIndex = 0;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ComboCommunes_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<Organization> list = new List<Organization>();
                Organization temp = new Organization()
                {
                    OrgID = 0,
                    NameOfOrgan = "Lựa chọn"
                };
                list.Add(temp);

                if (ComboCommunes.SelectedIndex == 0)
                {
                    ComboxOgrans.DataSource = list;
                    ComboxOgrans.DisplayMember = "NameOfOrgan";
                    ComboxOgrans.ValueMember = "OrgID";
                    ComboxOgrans.SelectedIndex = 0;
                }
                else
                {
                    int communeID = Int32.Parse(ComboCommunes.SelectedValue.ToString());

                    Commune commune = db.Communes.SingleOrDefault(p => p.ComID == communeID);
                    list.AddRange(commune.Organizations.ToList());

                    ComboxOgrans.DataSource = list;
                    ComboxOgrans.DisplayMember = "NameOfOrgan";
                    ComboxOgrans.ValueMember = "OrgID";
                    ComboxOgrans.SelectedIndex = 0;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void Controls_Reset()
        {
            AddButton.Enabled = true;
            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;
            ComboProvinces.SelectedIndex = 0;
            ErrorProvider.Dispose();
            CheckStatus.Checked = false;
            CodeText.Text = "";
            NameText.Text = "";
            DescText.Text = "";
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            ErrorProvider.Dispose();
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                if (ComboxOgrans.SelectedIndex == 0)
                {
                    ErrorProvider.SetError(ComboxOgrans, "Hãy chọn tổ chức cuả phòng ban cần thêm mới");
                    ComboxOgrans.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (CodeText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(CodeText, "Mã phòng ban không được để trống");
                    CodeText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();
                foreach (var item in db.Departments)
                {
                    if (item.CodeOfDep.ToLower().Equals(CodeText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(CodeText, "Mã phòng ban đã được sử dụng.");
                        CodeText.Focus();
                        return;
                    }
                }
                ErrorProvider.Dispose();

                if (NameText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NameText, "Tên phòng ban không được để trống");
                    NameText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();
                int orgId = Int32.Parse(ComboxOgrans.SelectedValue.ToString());
                Organization org = db.Organizations.Single(o => o.OrgID == orgId);
                foreach (var item in org.Departments)
                {
                    if (item.NameOfDep.ToLower().Equals(NameText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(NameText, "Trong cơ quan, tổ chức đã có phòng ban này.");
                        NameText.Focus();
                        return;
                    }
                }
                ErrorProvider.Dispose();

                if (DescText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(DescText, "Mô tả không được để trống");
                    DescText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                Department depart = new Department()
                {
                    CodeOfDep = CodeText.Text.Trim(),
                    NameOfDep = NameText.Text.Trim(),
                    Descriptons = DescText.Text.Trim(),
                    StatusOfDep = CheckStatus.Checked,
                    OrgID = int.Parse(ComboxOgrans.SelectedValue.ToString())
                };

                db.Departments.Add(depart);
                db.SaveChanges();
                ErrorProvider.Dispose();

                Controls_Reset();
                GridDeparts_Load(sender, e);

                AlertControl.Show(this, "Hệ thống thông báo", "Thêm mới phòng ban cho cơ quan thành công");
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }

        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            ErrorProvider.Dispose();
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                if (ComboxOgrans.SelectedIndex == 0)
                {
                    ErrorProvider.SetError(ComboxOgrans, "Hãy chọn tổ chức cuả phòng ban cần thêm mới");
                    ComboxOgrans.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (CodeText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(CodeText, "Mã phòng ban không được để trống");
                    CodeText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (NameText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NameText, "Tên phòng ban không được để trống");
                    NameText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (DescText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(DescText, "Mô tả không được để trống");
                    DescText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                List<int> listSelected = ViewDeparts.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }

                int departId = Int32.Parse(ViewDeparts.GetRowCellValue(index, "DepID").ToString());

                foreach (var item in db.Departments)
                {
                    if (item.CodeOfDep.ToLower().Equals(CodeText.Text.Trim().ToLower()) && item.DepID != departId)
                    {
                        ErrorProvider.SetError(CodeText, "Mã phòng ban đã được sử dụng.");
                        CodeText.Focus();
                        return;
                    }
                }

                int orgId = Int32.Parse(ComboxOgrans.SelectedValue.ToString());
                Organization org = db.Organizations.Single(o => o.OrgID == orgId);
                foreach (var item in org.Departments)
                {
                    if (item.NameOfDep.ToLower().Equals(NameText.Text.Trim().ToLower()) && item.DepID != departId)
                    {
                        ErrorProvider.SetError(NameText, "Trong cơ quan, tổ chức đã có phòng ban này.");
                        NameText.Focus();
                        return;
                    }
                }

                Department dep = db.Departments.Single(d => d.DepID == departId);
                dep.CodeOfDep = CodeText.Text.Trim();
                dep.NameOfDep = NameText.Text.Trim();
                dep.Descriptons = DescText.Text.Trim();
                dep.StatusOfDep = CheckStatus.Checked;
                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();
                    ErrorProvider.Dispose();

                    Controls_Reset();
                    GridDeparts_Load(sender, e);

                    AlertControl.Show(this, "Hệ thống thông báo", "Cập nhật thông tin cho phòng ban thành công");
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void DeleteButton_Click(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<int> listSelected = ViewDeparts.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }

                int departId = Int32.Parse(ViewDeparts.GetRowCellValue(index, "DepID").ToString());
                Department dep = db.Departments.Single(d => d.DepID == departId);
                db.Departments.Remove(dep);
                if (MessageBox.Show("Bạn có muốn xóa phòng ban này không?", "Xóa phòng ban", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();
                    ErrorProvider.Dispose();

                    Controls_Reset();
                    GridDeparts_Load(sender, e);
                    AlertControl.Show(this, "Hệ thống thông báo", "Xóa thông tin cho phòng ban thành công");
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn hủy bỏ thông tin và làm mới?", "Hủy bỏ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                Controls_Reset();
            }
        }
    }
}